package huffman;

/**
 * @author 谭继好
 * @Description 使用哈夫曼树对数据进行压缩，版本一，对于大文件压缩缓慢
 * @date 2024-05-16 16:52
 */
public class SingleThreadZip {

    private HuffmanTree huffmanTree;

    public void zip(String path) {

        // 读取文件内容，构建哈夫曼树
        String content = Utils.readAllFile(path);
        huffmanTree = new HuffmanTree(content);

        // 编码并写出
        Utils.writeToFile(path.replace(".txt", "-zip.txt"), Utils.joinInfo(huffmanTree).toString());
    }

    public void unzip(String path) {

        // 读取文件
        String content = Utils.readAllFile(path);

        // 转换后字符以"李"结束，分割字符串。可能出现多个"李"，这里从第一个分开
        int spilt = content.indexOf("李"), end = content.indexOf('\n', spilt + 1);

        // 恢复映射关系并构建哈夫曼树
        char[] arr = content.substring(end + 1).toCharArray();
        huffmanTree = new HuffmanTree(Utils.initialRelation(arr));

        // 解码并输出到对应文件
        StringBuilder res =  huffmanTree.decode(content.substring(0, end));
        Utils.writeToFile(path.replace("-zip.txt", "-recover.txt"), res.toString());
    }

}
